#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2024/3/27 17:13
# @Author : 闫峰
# @File    : montior_no_sales.py
from common.setting import ensure_path_sep
from utils.mysqlUtils.db_pool import Database
from utils.noticeUtils.dingtalkControl import DingTalkSendMsg
from utils.otherutils.MyThreadPool import MyThreadPool
from utils.otherutils.batch_sql import batch_sql
from utils.times_tool.time_control import count_time
from apps.zhcxkj_center_product.prod.utils.rb_product import RbProduct

class MonitorNoSales:

    @staticmethod
    def test_main():
        """
        主测试函数，用于执行MonitorNoSales类中的数据处理和发送任务。
        该函数不接受参数，也不返回任何值。
        """

        # 删除旧数据
        MonitorNoSales.delete_data()

        # 获取仿牌SKU列表
        common_nosalesku_list = RbProduct.get_product_property_sku_list()
        def split_list(input_list, chunk_size=1000):
            return [input_list[i:i + chunk_size] for i in range(0, len(input_list), chunk_size)]


        split_large_list = split_list(common_nosalesku_list)
        MyThreadPool(19).multithreaded(MonitorNoSales().func, tuple(split_large_list))
        # 发送钉钉通知
        MonitorNoSales.send_ding()

    @staticmethod
    def send_ding():
        """
        发送钉钉消息，用于提醒Shopee平台禁售产品的数量。

        :return: 无返回值
        """
        # 查询monitor_shopee_listing_nosales表中需要发送的数据数量
        db_java_test = Database(ensure_path_sep("\\config\\shopeev2_config.yaml.bak"), "test_jdw_database")
        get_data_list_sql = """
            select count(1) as num from monitor.monitor_jdwalmart_listing_nosales
        """
        data_list = db_java_test.fetch_all_tuple(get_data_list_sql, ())
        if not len(data_list):
            return
        count = data_list[0][0]  # 获取禁售产品数量

        # 构造钉钉消息文本
        text = f"---  \n\n" \
               f"jdwalmart平台禁售产品数：<font color='red' size='5'>{count}</font>  \n" \
               f"---  \n\n"

        # 发送钉钉消息
        DingTalkSendMsg(DingTalk='all_platform_monitor').send_success(text=text,
                                                                      title='jdwalmart平台禁售产品数监控服务',
                                                                      phone_list=[18118758151, 15767667648,
                                                                                  13841609957])

    @staticmethod
    def delete_data():
        """
        静态方法，用于删除指定数据库中的数据。

        参数:
        无

        返回值:
        无
        """
        # 初始化数据库连接，使用配置文件中的信息
        db_java_test = Database(ensure_path_sep("\\config\\shopeev2_config.yaml.bak"), "test_jdw_database")
        # 定义删除操作的SQL语句
        delete_sql = """
            delete from monitor.monitor_jdwalmart_listing_nosales
        """
        # 执行SQL语句，并获取影响的行数
        rows = db_java_test.execute(delete_sql, ())
        # 打印删除操作的结果
        print(f"删除了数据表monitor_shopee_listing_nosales{rows}条数据")

    @count_time
    def func(self,common_nosalesku_list):
        """
        监控并处理Shopee平台上的无销售产品数据。

        :param source_id: 数据源ID，用于标识不同的数据来源。
        :param country_shorthand: 国家缩写，用于指定具体的Shopee市场。
        :param common_nosalesku_list: 公共的无销售SKU列表，用于筛选特定的无销售产品。
        :return: 无返回值，主要进行数据库操作，将无销售产品信息插入到监控数据库中。
        """

        # 初始化两个数据库连接，分别用于查询和插入数据
        zhcxkj_center_listing_comprehensive_db = Database(ensure_path_sep("\\config\\shopeev2_config.yaml.bak"),
                                                          "zhcxkj_center_listing_comprehensive")
        db_java_test = Database(ensure_path_sep("\\config\\shopeev2_config.yaml.bak"), "test_jdw_database")
        # 构造SQL查询语句，用于从综合列表数据库中分批获取产品信息
        filter = """
            SELECT
        	source_id ,
        	source_name ,
        	item_id,
        	source_sku ,
        	sku
        FROM
        	zhcxkj_center_listing_comprehensive.t_jdwalmart_listing 
        WHERE
        	 sku IN %s
        	 	AND `status` IN ( 0, 1 ) 
        	AND is_deleted = 0 ;
            """
        data_list = zhcxkj_center_listing_comprehensive_db.fetch_all_tuple(filter,(list(common_nosalesku_list),))
        if not len(data_list):
            return
        # 构造插入数据的SQL语句，并执行插入操作
        insert_sql = """
        REPLACE INTO monitor.monitor_jdwalmart_listing_nosales 
        (source_id, source_name,item_id,source_sku, sku, create_time, update_time)
        VALUES (%s,%s,%s,%s,%s,now(),now());
        """
        insert_data = list(map(lambda x: (x[0],x[1], x[2], x[3],x[4]), data_list))
        rows = db_java_test.execute_many(insert_sql, insert_data)


    @staticmethod
    def get_no_sku_list(platform_type, country_shorthand, common_nosalesku_list):
        """
        获取指定平台类型和国家缩写下的无销售SKU列表，以及通用的无销售SKU列表合并后的结果。

        参数:
        platform_type: 平台类型，用于筛选无销售SKU。
        country_shorthand: 国家缩写，用于筛选无销售SKU。
        common_nosalesku_list: 通用的无销售SKU列表，无论平台和国家如何，都会被包含在结果中。

        返回值:
        返回一个集合，包含指定平台类型、国家缩写下的无销售SKU列表，以及通用无销售SKU列表合并后的所有SKU。
        """

        # 初始化产品数据库连接
        product_db = Database(ensure_path_sep("\\config\\shopeev2_config.yaml.bak"), "HWY-ZH-GZ-RDS-Product")

        # 构造SQL语句，用于查询指定平台类型和国家缩写下的无销售SKU
        get_nosales_sku_list = """
            SELECT sku FROM `zhcxkj-center-product`.rb_product_no_sale 
        WHERE
        platform_type = %s
        and country_shorthand = %s 
            """

        # 执行查询，并将结果转换为SKU的集合
        nosales_sku_list = product_db.fetch_all_tuple(get_nosales_sku_list, (platform_type, country_shorthand))
        return set(map(lambda x: x[0], nosales_sku_list)) | common_nosalesku_list

    @staticmethod
    def get_common_nosalesku_list(platform_type):
        """
        获取指定平台类型的通用禁售SKU列表

        参数:
        platform_type: str - 平台类型

        返回值:
        set - 通用禁售SKU的集合
        """
        # 初始化数据库连接
        product_db = Database(ensure_path_sep("\\config\\shopeev2_config.yaml.bak"), "HWY-ZH-GZ-RDS-Product")
        # 构造查询禁售SKU的SQL语句
        get_nosales_sku_list = """
            SELECT sku FROM `zhcxkj-center-product`.rb_product_no_sale 
        WHERE 
        platform_type = %s     
        and country_shorthand=""
            """
        # 执行SQL查询并获取结果
        nosales_sku_list = product_db.fetch_all_tuple(get_nosales_sku_list, (platform_type,))
        return list(map(lambda x: x[0], nosales_sku_list))



if __name__ == '__main__':
    # data = ((13530, 'MY'),)
    MonitorNoSales.test_main()
    # MonitorNoSales.func()
